package com.xiaocz.hblsubstitutedriving.base;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Rect;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.inputmethod.InputMethodManager;

import com.gyf.barlibrary.ImmersionBar;
import com.xiaocz.common.widgets.dialog.LoadingDialog;
import com.xiaocz.hblsubstitutedriving.R;
import com.xiaocz.hblsubstitutedriving.utils.AppUtil;

import java.util.ArrayList;
import java.util.List;

import butterknife.ButterKnife;
import butterknife.Unbinder;
import okhttp3.Call;


/**
 * Descr:   Activity活动的基类
 * Author:  xiaocz.
 * Date:    2018/1/19.
 */

public abstract class Activity extends AppCompatActivity {

    // 目标打印标识
    protected static String TAG;

    // 上下文对象getVersionCode
    protected Context mContext;

    public List<Call> listCall = new ArrayList<>();

    private Unbinder unbinder;

    /**
     * 启动Activity时执行的方法
     *
     * @param savedInstanceState
     */
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 如果能正常接收上一界面传递过来的参数则显示当前界面
        // 否则关闭当前界面的显示
        // 默认无参数传递的情况下是正常显示当前界面的
        if (initArgs(getIntent().getExtras())) {
            //添加所有页面
            AppUtil.add(this);
            // 初始化目标打印标识
            TAG = this.getClass().getSimpleName();

            // 初始化上下文对象
            mContext = this;

            // 加载布局界面
            setContentView(getLayoutSourceId());

            //绑定初始化ButterKnife
            unbinder = ButterKnife.bind(this);

            // 初始化控件之前调用
            init(savedInstanceState);

            // 初始化布局控件
            initWidgets();

            // 初始化数据
            initData();

            initImmersionBar();
        } else {
            finish();
        }
    }

    /**
     * 初始化沉浸式
     * Init immersion bar.
     */
    protected void initImmersionBar() {
        // 初始化沉浸式状态栏框架
        ImmersionBar.with(this)
                .statusBarColor(R.color.colorPrimary).keyboardEnable(false)//键盘
                .navigationBarColor(R.color.colorAccent)
                .fullScreen(false).statusBarDarkFont(true, 0.2f)//原前设备支持状态栏字体变色，会设置状态栏字体为黑色，如果当前设理：如果当备不支持状态栏字体变色，会使当前状态栏加上透明度，否则不执行透明度
                .init();
    }

    private LoadingDialog loadingDialog;

    /**
     * @param canBack true 可以取消 false 不可以取消 设置在点击Dialog外是否取消Dialog进度条
     */
    public void loadingDialogShow(boolean canBack, int view) {
        if (loadingDialog != null) {
            loadingDialog.cancel();
        } else {
            loadingDialog = new LoadingDialog(this);
        }
        loadingDialog.show(canBack, view);
    }

    public void loadingDialogShow(boolean canBack) {
        if (loadingDialog != null) {
            loadingDialog.cancel();
        } else {
            loadingDialog = new LoadingDialog(this);
        }
        loadingDialog.show(canBack, R.layout.layout_state_loading);
    }

    public void onDismiss() {
        if (loadingDialog != null) {
            loadingDialog.dismiss();
            loadingDialog = null;
        }
    }

    /**
     * @param rootView   根布局
     * @param bottomView 需要显示的最下方View，
     */
    public void addLayoutListener(final View rootView, final View bottomView) {
        rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                Rect rect = new Rect();
                rootView.getWindowVisibleDisplayFrame(rect);//获取rootView的可视区域
                int invisibleHeight = rootView.getRootView().getHeight() - rect.bottom;//获取rootView的不可视区域高度
                if (invisibleHeight > 200) { //键盘显示
                    int[] location = new int[2];
                    bottomView.getLocationInWindow(location); //获取bottomView的坐标
                    int scrollHeight = (location[1] + bottomView.getHeight()) - rect.bottom;//算出需要滚动的高度
                    if (scrollHeight != 0) {//防止界面元素改变调用监听，使界面上下跳动，如验证码倒计时
                        rootView.scrollTo(0, Math.abs(scrollHeight));
                    }
                } else {
                    rootView.scrollTo(0, 0);
                }
            }
        });
    }

    /**
     * 销毁
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbinder.unbind();
        for (Call item : listCall) {
            item.cancel();//取消请求
        }
        AppUtil.remove(this);
        ImmersionBar.with(this).destroy(); //必须调用该方法，防止内存泄漏
    }

    /**
     * 初始化接收上一界面传递过来的参数
     *
     * @param bundle 用于接收参数的Bundle对象
     * @return 返回true表示接收参数成功，返回false表示接收参数失败（默认返回true）
     */
    protected boolean initArgs(Bundle bundle) {
        return true;
    }


    /**
     * 初始化获取界面布局资源ID（子类必须实现）
     *
     * @return 界面布局资源的ID
     */
    protected abstract int getLayoutSourceId();


    /**
     * 初始化控件之前调用
     */
    protected void init(Bundle savedInstanceState) {
    }


    /**
     * 初始化布局控件
     */
    protected void initWidgets() {
    }


    /**
     * 初始化数据
     */
    protected void initData() {
    }


    /**
     * Activity界面点击导航标题栏返回按钮触发的回调方法
     *
     * @return
     */
    @Override
    public boolean onSupportNavigateUp() {
        hideKeyboard();
        // 如果用户按下则关闭Activity显示界面
        finish();
        return super.onSupportNavigateUp();
    }


    /**
     * Activity界面返回按键触发的回调方法
     */
    @Override
    public void onBackPressed() {
        // 第一步，获取到Activity关联的所有Fragment碎片对象
        List<android.support.v4.app.Fragment> fragmentList = getSupportFragmentManager().getFragments();

        // 第二步，遍历所有Fragment碎片对象，并查看每个Fragment碎片对象的返回按键事件是否为自己处理
        for (Fragment fragment : fragmentList) {
            // 判断Fragment对象是否为我们自己定义的能够处理的Fragment碎片对象类型
            if (fragment instanceof com.xiaocz.hblsubstitutedriving.base.Fragment) {
                // 判断当前的Fragment碎片对象是否自己处理了返回按键事件
                // 如果自己处理了则直接返回，不需要Activity再进行处理
                if (((com.xiaocz.hblsubstitutedriving.base.Fragment) fragment).onBackPressed()) {
                    return;
                }
            }
        }
        super.onBackPressed();
        // 关闭Activity显示界面
        //finish();
    }

    /*
     * 获取当前程序的版本号
     */
    public int getVersionCode() throws Exception {
        //获取packagemanager的实例
        PackageManager packageManager = getPackageManager();
        //getPackageName()是你当前类的包名，0代表是获取版本信息
        PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(), 0);
        return packInfo.versionCode;
    }

    /*
     * 获取当前程序的版本
     */
    public String getVersionName() {
        //获取packagemanager的实例
        PackageManager packageManager = getPackageManager();
        PackageInfo packInfo = null;
        try {
            packInfo = packageManager.getPackageInfo(getPackageName(), 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return packInfo.versionName;
    }

    /**
     * 隐藏软键盘
     **/
    public void hideKeyboard() {
        View view = getWindow().peekDecorView();
        if (view != null) {
            InputMethodManager inputmanger = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            inputmanger.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }
}
